package com.hzhh123;

import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

import org.junit.Test;

/*
*
* 一、方法引用：若 Lambda 体中的功能，已经有方法提供了实现，可以使用方法引用
* 			  （可以将方法引用理解为 Lambda 表达式的另外一种表现形式）
* 
* 1. 对象的引用 :: 实例方法名
* 
* 2. 类名 :: 静态方法名
* 
* 3. 类名 :: 实例方法名
* 
* 注意：
* 	 ①方法引用所引用的方法的参数列表与返回值类型，需要与函数式接口中抽象方法的参数列表和返回值类型保持一致！
* 	 ②若Lambda 的参数列表的第一个参数，是实例方法的调用者，第二个参数(或无参)是实例方法的参数时，格式： ClassName::MethodName
* 
* 二、构造器引用 :构造器的参数列表，需要与函数式接口中参数列表保持一致！
* 
* 1. 类名 :: new
* 
* 三、数组引用
* 
* 	类型[] :: new;
* 
* 
*/
public class TestMethodRef {

	@Test
	public void test1() {
		Consumer<String>con=(str)->System.out.println(str);
		con.accept("hello world");
		System.out.println("---------------------------------");
		Consumer<String>con1=System.out::println;
		con1.accept("fghjk");
	}
	
	//对象的引用::实例方法
	@Test
	public void test2() {
		Employee emp=new Employee("张三", 23, 18000.99);
		Supplier<String>sup1=()->emp.getName();
		System.out.println(sup1.get());
		System.out.println("----------------");
		Supplier<String>sup=emp::getName;
		System.out.println(sup.get());
	}
	
	//类名::静态方法
	@Test
	public void test3() {
		BiFunction<Double, Double, Double>fun=(x,y)->Math.pow(x, y);
		System.out.println(fun.apply(10.1, 2.0));
		System.out.println("----------------------");
		BiFunction<Double, Double, Double>fun1=Math::pow;
		System.out.println(fun1.apply(10.1, 2.0));
	}
	
	//类名 :: 实例方法名
	@Test
	public void test4() {
		BiPredicate<String, String>bi=(x,y)->x.equals(y);
		System.out.println(bi.test("ank", "ank"));
		System.out.println("------------------");
		BiPredicate<String, String>bi1=String::equals;
		System.out.println(bi1.test("ank", "ank"));
		System.out.println();
		Function<Employee, String>fun=(e)->e.toString();
		System.out.println(fun.apply(new Employee("张三",12,899.0)));
		
		Function<Employee, String>fun1=Employee::toString;
		System.out.println(fun1.apply(new Employee("张三",12,899.0)));
	}
	
	//构造器引用
	@Test
	public void test5() {
		//有参构造器，只传递一个参数
		Function<String, Employee> fun = Employee::new;
		BiFunction<String, Integer, Employee>bi=Employee::new;
	}
	@Test
	public void test6(){
		Supplier<Employee> sup = () -> new Employee();
		System.out.println(sup.get());
		
		System.out.println("------------------------------------");
		
		Supplier<Employee> sup2 = Employee::new;
		System.out.println(sup2.get());
	}
	
	//数组引用
	@Test
	public void test7() {
		Function<Integer, String[]>fun=(args)->new String[args];
		String []strs=fun.apply(10);
		System.out.println(strs.length);
		System.out.println("----------------------");
		Function<Integer, Employee[]> fun2 = Employee[] :: new;
		Employee[] emps = fun2.apply(20);
		System.out.println(emps.length);
	}
}
